package com.atguigu.gulimall.ware.service;

import com.atguigu.common.to.mq.OrderTO;
import com.atguigu.common.to.mq.StockLockedTO;
import com.atguigu.gulimall.ware.vo.LockStockResult;
import com.atguigu.gulimall.ware.vo.SkuHasStockVO;
import com.atguigu.gulimall.ware.vo.WareSkuLockVO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.gulimall.ware.entity.WareSkuEntity;

import java.util.List;
import java.util.Map;

/**
 * 商品库存
 *
 * @author baixiaofei
 * @email 2053989588@qq.com
 * @date 2025-01-17 00:14:51
 */
public interface WareSkuService extends IService<WareSkuEntity> {

    PageUtils queryPage(Map<String, Object> params);

    void addStock(Long skuId, Long wareId, Integer skuNum);

    List<SkuHasStockVO> getSkusHasStock(List<Long> skuIds);

    /**
     * 为某个订单锁库存
     * @param vo
     * @return
     */
    Boolean orderLockStock(WareSkuLockVO vo);

    void unlockStock(StockLockedTO to);

    /**
     * 害怕服务器网络卡顿 造成订单解锁消息一直没有被消费（也就是说执行解锁订单的方法没有被执行）
     *  -->  又因为自动解锁库存的前提条件是解锁订单之后 如果订单没有被解锁 库存消息就会过期 然后被丢掉
     *       当网络恢复好了之后订单解锁之后 库存自动解锁就永远不会被执行 就tmd出大问题啦
     *       因此这个救世主一般的重载方法就出现了
     * @param orderTo
     */
    void unlockStock(OrderTO orderTo);
}

